package cn.jsc.service.impl;

import cn.jsc.constants.BaseConstants;
import cn.jsc.domain.Employee;
import cn.jsc.domain.Login;
import cn.jsc.domain.Tenant;
import cn.jsc.dto.LoginMealDto;
import cn.jsc.dto.RegisterDto;
import cn.jsc.exception.MyException;
import cn.jsc.feign.client.LoginFeignClient;
import cn.jsc.mapper.EmployeeMapper;
import cn.jsc.mapper.TenantMapper;
import cn.jsc.result.JSONResult;
import cn.jsc.service.ITenantService;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import io.seata.spring.annotation.GlobalTransactional;
import org.apache.commons.lang.time.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author chuanchuan
 * @since 2022-01-16
 */
@Service
public class TenantServiceImpl extends ServiceImpl<TenantMapper, Tenant> implements ITenantService {
    @Autowired
    private LoginFeignClient loginFeignClient;
    
    @Autowired
    private TenantMapper tenantMapper;

    @Autowired
    private EmployeeMapper employeeMapper;
    /**
     * 机构入驻
     * @param registerDto
     * @return
     */
    @Override
    @GlobalTransactional//开启seata全局事务
    public JSONResult register(RegisterDto registerDto) {
        /**
         * 1、入参校验
         * 2、t_tenant、t_employee入库
         * 3、t_login_meal、。t_login入库，调用Auth的接口入库，用Feign
         * 4、返回结果
         */
        //校验

        //保存信息到t_login表
        Login login = new Login();
        //设置密码
        login.setPassword(registerDto.getPassword());
        //设置公司名
        login.setUsername(registerDto.getUsername());
        login.setType(0);//0是后台，1是前台
        //调用Feign接口里面的方法去调用auth服务的新增方法
        JSONResult jsonResult_1 = loginFeignClient.save(login);
        if(!"0000".equals(jsonResult_1.getCode())){
            //调用失败
            throw new MyException("保存login表数据到auth失败");
        }
        //获取结果里面的loginId
//        Object data = jsonResult_1.getData();

        String data = (String) jsonResult_1.getData();
        //把json字符串转换成对象   阿里的fastjson
        Login loginData = JSONObject.parseObject(data, Login.class);

        //转换成Long类型
//        Long loginId = Long.valueOf(data.toString());

        Long loginId = loginData.getId();

        System.out.println("loginId=" + loginId);

        //保存信息到t_login_meal表
        LoginMealDto loginMealDto = new LoginMealDto();
        //设置登录id
        loginMealDto.setLoginId(loginId);
        //设置套餐id
        loginMealDto.setMealId(registerDto.getMealId());
        //设置过期时间，7天后过期
        loginMealDto.setExpireDate(DateUtils.addDays(new Date(),7));
        //调用Feign接口里面的方法去调用auth服务的新增方法
        JSONResult jsonResult = loginFeignClient.saveLoginMeal(loginMealDto);
        if(!"0000".equals(jsonResult.getCode())){
            //调用失败
            throw new MyException("保存loginMeal表数据到auth失败");
        }

        //保存信息到 t_tenant 表
        Tenant tenant = registerDto.getTenant();
        tenant.setRegisterTime(new Date());//注册时间
        tenantMapper.insert(tenant);

        //保存信息到 t_employee 表
        Employee employee = registerDto.getEmployee();
        employee.setInputTime(new Date());//创建时间
        employee.setType(4);//员工类型 ， 1平台普通员工 ，2平台客服人员，3平台管理员，4机构员工，5,机构管理员或其他
        employee.setState(BaseConstants.EmployeeConstants.STATUS_EMPLOYEE_0);//状态：0正常，1锁定，2注销
        employee.setLoginId(loginId);//登录id
        employee.setTenantId(tenant.getId());//当前员工所属机构ID
        employeeMapper.insert(employee);

        //更新机构表t_tenant
        tenant.setAdminId(employee.getId());//设置AdminId
        tenantMapper.updateById(tenant);

//        int i=1/0;

        return JSONResult.success();
    }
}
